<?php

use think\Db;

// ignore_user_abort(true);
set_time_limit(0);
ini_set('memory_limit', '-1');
date_default_timezone_set('PRC');

include './vendor/autoload.php';

$dbConfig = [
    // 数据库类型
    'type'            => 'mysql',
    // 服务器地址
    'hostname'        => '127.0.0.1',
    // 数据库名
    'database'        => 'dao',
    // 用户名
    'username'        => 'root',
    // 密码
    'password'        => 'qq5752020',
    // 端口
    'hostport'        => '3306',
    // 连接dsn
    'dsn'             => '',
    // 数据库连接参数
    'params'          => [],
    // 数据库编码默认采用utf8
    'charset'         => 'utf8',
    // 数据库表前缀
    'prefix'          => 't_',
    // 数据库调试模式
    'debug'           => true,
    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    'deploy'          => 0,
    // 数据库读写是否分离 主从式有效
    'rw_separate'     => false,
    // 读写分离后 主服务器数量
    'master_num'      => 1,
    // 指定从服务器序号
    'slave_no'        => '',
    // 自动读取主库数据
    'read_master'     => false,
    // 是否严格检查字段是否存在
    'fields_strict'   => true,
    // 数据集返回类型
    'resultset_type'  => 'array',
    // 自动写入时间戳字段
    'auto_timestamp'  => false,
    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',
    // 是否需要进行SQL性能分析
    'sql_explain'     => false,
    // Builder类
    'builder'         => '',
    // Query类
    'query'           => '\\think\\db\\Query',
    // 是否需要断线重连
    'break_reconnect' => false,
    // 断线标识字符串
    'break_match_str' => [],
];

// 数据库配置信息设置（全局有效）
Db::setConfig($dbConfig);

include './Classes/PHPExcel/IOFactory.php';

function read($inputFileName)
{

    $inputFileName = str_replace('\\', '/', $inputFileName);

    // 读取excel文件
    try {
        $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
        $objReader     = PHPExcel_IOFactory::createReader($inputFileType);
        $objPHPExcel   = $objReader->load($inputFileName);
    } catch (Exception $e) {
        die('加载文件发生错误：' . pathinfo($inputFileName, PATHINFO_BASENAME) . ': ' . $e->getMessage());
    }
    // 确定要读取的sheet，什么是sheet，看excel的右下角，真的不懂去百度吧
    $sheet         = $objPHPExcel->getSheet(0);
    $highestRow    = $sheet->getHighestRow();
    $highestColumn = $sheet->getHighestColumn();
    $_data         = [];

    // 获取一行的数据
    for ($row = 1; $row <= $highestRow; $row++) {
        // Read a row of data into an array
        $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, 2, true, false);
        //这里得到的rowData都是一行的数据，得到数据后自行处理，我们这里只打出来看看效果
        // print_r($rowData);
        $_data[] = array_slice($rowData[0], 0, 16);
    }
    return $_data;
}

function read_all($dir)
{
    if (!is_dir($dir)) {
        return false;
    }

    $handle = opendir($dir);

    if ($handle) {
        while (($fl = readdir($handle)) !== false) {

            ob_start();

            $temp = $dir . DIRECTORY_SEPARATOR . $fl;
            //如果不加  $fl!='.' && $fl != '..'  则会造成把$dir的父级目录也读取出来
            if (is_dir($temp) && $fl != '.' && $fl != '..') {
                echo '目录：' . $temp . '<br>';
                exit;
                read_all($temp);
            } else {
                if ($fl != '.' && $fl != '..') {

                    // printf("progress: [%-50s] %d%% Done\r", str_repeat('#',$i/$total*50), $i/$total*100);

                    echo '正在打开文件: ' . $temp . PHP_EOL;
                    ob_flush();
                    flush();
                    $data = read($temp);

                    // 写入
                    // echo '<pre>' . print_r($data) . '</pre><br><br>';

                    // 数据处理
                    $data_ = [];
                    foreach ($data as $key => $item) {
                        $data_[] = [
                            'company_name'               => isset($item[0]) ? $item[0] : '',
                            'legal_person'               => isset($item[1]) ? $item[1] : '',
                            'registered_capital'         => isset($item[2]) ? $item[2] : '',
                            'establishment_date'         => isset($item[3]) ? $item[3] : '',
                            'management_state'           => isset($item[4]) ? $item[4] : '',
                            'province'                   => isset($item[5]) ? $item[5] : '',
                            'city'                       => isset($item[6]) ? $item[6] : '',
                            'district'                   => isset($item[7]) ? $item[7] : '',
                            'company_type'               => isset($item[8]) ? $item[8] : '',
                            'unified_social_credit_code' => isset($item[9]) ? $item[9] : '',
                            // 10 11 空的
                            'published_address'          => isset($item[12]) ? $item[12] : '',
                            // 13 没网址字段，不保存网址
                            'published_mail'             => isset($item[14]) ? $item[14] : '',
                            // 数据中无联系方式
                            'public_contact_telephone'   => '',
                            'public_contact_telephones'  => '',
                            'business_scope'             => isset($item[15]) ? $item[15] : '',
                        ];
                    }

                    // print_r($data_);
                    echo '此文件有: ' . count($data_) . ' 条数据' . PHP_EOL;
                    echo '正在写入数据...' . PHP_EOL;

                    // 插入一个文件的所有行到数据库
                    insert($data_);
                    echo '写入成功！' . PHP_EOL . PHP_EOL;
                    ob_flush();
                    flush();
                }
            }
        }
    }
}

function insert($data)
{
    $chunkData = array_chunk($data, 2, true);
    foreach ($chunkData as $key => $item) {
        // limit 没有任何作用，只能自己用 array_chunk 解决
        // $res = Db::table('t_company_info2')->limit(1)->fetchSql(true)->insertAll($item);
        $res = Db::table('t_company_info2')->insertAll($item);
        // echo $res;
    }
}

read_all(__DIR__ . '/file_path');

echo '全部处理完成' . PHP_EOL . PHP_EOL;
ob_flush();
flush();

